/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

///////////////////////////////////////////////////////////
/// \file UDP.h Ce fichier procure les foctions nécessaire 
/// à la manipulation des sockets UDP. Les types et énumérations 
/// utilisés sont définies dans le fichier Network.h.
//////////////////////////////////////////////////////////

#ifndef CSLP_UDP_HEADER
# define CSLP_UDP_HEADER

# include "dll.h"
# include "Network.h"

# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */

///////////////////////////////////////////////////////////
/// Permet de créer un socket UDP.
/// \return CSLP_INVALID_SOCKET en cas d'erreur.
/// \return Une valeur positive en cas de succès.
///////////////////////////////////////////////////////////
CSLP_UDPSOCKET DLL_IMPEXP CSLP_InitUDPSocket();

///////////////////////////////////////////////////////////
/// Permet ce lier un socket UDP à un port. Le socket passer en paramètre
/// s'utilisera alors comme socket UDP serveur.
///
/// \param serverSock Le socket qui servira de socket serveur.
/// \param port Le port auquel lier le socket.
/// \return 0 en cas de succès.
/// \return -1 en cas d'erreur.
///////////////////////////////////////////////////////////
int DLL_IMPEXP CSLP_Bind(CSLP_UDPSOCKET serverSock, unsigned short port);

///////////////////////////////////////////////////////////
/// Permet d'envoyer des données 'data' d'une taille de 'dataLen' octets
/// depuis le socket 'sock' à l'adresse 'IP' sur le port 'port'.
///
/// \param sock Le socket à utiliser pour l'envois de données.
/// \param data Un tableau d'octets qui sera envoyé.
/// \param dataLen La taille du tableau data en octets.
/// \param IP L'adresse IP de destination au format big endian 
/// (voir CSLP_ULongToBigEndian()).
/// \param port Le port de destination.
/// \return NONE en cas de succès
/// \return Une autre valeur de CSLP_NETWORK_ERROR en cas d'erreur.
///////////////////////////////////////////////////////////
CSLP_NETWORK_ERROR DLL_IMPEXP CSLP_SendTo(CSLP_UDPSOCKET sock, const void* data, size_t dataLen, unsigned long IP, unsigned short port);

///////////////////////////////////////////////////////////
/// Permet de recevoir des données avec un socket UDP
///
/// \param sock Le socket qui reçois les données.
/// \param data Un tableau d'octets qui sera remplis pendant la réception
/// \param dataLen La taille du tableau d'octet et par conséquent le
/// nombre maximum d'octet pouvant être reçus.
/// \param bytesWrite Le nombre d'octets écrits dans le tableau data
/// \param IP L'adresse IP depuis laquelle sont reçus les données au 
/// format big endian. (voir CSLP_ULongToBigEndian())
/// \param port Le port depuis lequel sont reçus les données.
/// \return NONE en cas de succès.
/// \return Une autre valeur de CSLP_NETWORK_ERROR en cas d'erreur.
///////////////////////////////////////////////////////////
CSLP_NETWORK_ERROR DLL_IMPEXP CSLP_ReceiveFrom(CSLP_UDPSOCKET sock, void* data, size_t dataLen, size_t* bytesWrite, unsigned long* IP, unsigned short* port);

///////////////////////////////////////////////////////////
/// Permet de fermer un socket et de libérer les ressources allouées par
/// ce dernier.
/// 
/// \param sock Le socket à fermer.
///////////////////////////////////////////////////////////
void DLL_IMPEXP CSLP_CloseUDPSocket(CSLP_UDPSOCKET sock);

# ifdef __cplusplus
}
# endif /* __cplusplus */

#endif /* CSLP_UDP_HEADER */
